Плохо! Плохо!:  0
Показано с 1 по 4 из 4

Тема: [MZ] Phileas_GameHotKeys

  1. #1
    Бывалый Аватар для Phileas
    Информация о пользователе
    Регистрация
    05.02.2016
    Адрес
    HD 128620, HR 5459, CP−60°5483, GCTP 3309.00A, LHS 50
    Сообщений
    628
    Записей в дневнике
    26
    Репутация: 23 Добавить или отнять репутацию

    По умолчанию [MZ] Phileas_GameHotKeys

    Название плагина: Phileas's Game Hot Keys

    Автор: Phileas

    Версия: 1.1.2 для MZ

    Дата выхода:
    1.0.0 - 18.07.2023
    1.0.1 - 24.08.2023
    1.1.0 - 19.01.2024
    1.1.1 - 21.01.2024
    1.1.2 - 29.01.2024

    Описание плагина:
    Плагин назначает общие события и переключатели клавишам клавиатуры, геймпада и мыши.

    У плагина 2 параметра: Common Events и Switches. Они отличаются только одним полем: в Common Events задаётся номер общего события, а в Switches - переключатель. Остальные поля общие:
    - Device type - устройство, нажатия на которое нужно отслеживать.
    - Key name - строковый идентификатор кнопки.
    - Key number - числовой идентификатор кнопки.

    Начиная с версии 1.1.0, в Общих событиях можно включить блокировку. Если она включена, то повторно стриггерить событие можно будет только после того, как оно завершит выполнение.

    Плагин предоставляет одну команду:
    - Контроллер - позволяет включить и отключить горячие клавиши.

    Сначала плагин ищет Key name в стандартных словарях движка. Если вы их не переопределяли, то они выглядят так:

    keyBoard:
    9: "tab", // tab
    13: "ok", // enter
    16: "shift", // shift
    17: "control", // control
    18: "control", // alt
    27: "escape", // escape
    32: "ok", // space
    33: "pageup", // pageup
    34: "pagedown", // pagedown
    37: "left", // left arrow
    38: "up", // up arrow
    39: "right", // right arrow
    40: "down", // down arrow
    45: "escape", // insert
    81: "pageup", // Q
    87: "pagedown", // W
    88: "escape", // X
    90: "ok", // Z
    96: "escape", // numpad 0
    98: "down", // numpad 2
    100: "left", // numpad 4
    102: "right", // numpad 6
    104: "up", // numpad 8
    120: "debug" // F9
    gamepad:
    0: "ok", // A
    1: "cancel", // B
    2: "shift", // X
    3: "menu", // Y
    4: "pageup", // LB
    5: "pagedown", // RB
    12: "up", // D-pad up
    13: "down", // D-pad down
    14: "left", // D-pad left
    15: "right" // D-pad right
    mouse:
    0: "left"
    1: "middle"
    2: "right"

    Если плагин не нашёл Key name, то он берёт значение Key number.

    Если во время игры произошло нажатие на клавиатуру, геймпад или мышь, плагин проверяет, не назначено ли на клавишу общее событие или переключатель. Если назначено общее событие, оно исполняется. Не рекомендуется указывать параллельное или автоматическое событие. Если назначен переключатель, его значение меняется на противоположное.

    Как это выглядит:


    Код:
    Спойлер Версия 1.1.2:
    [CODE]
    //================================================== ===========================
    // Phileas_GameHotKeys.js
    //================================================== ===========================
    // [Update History]
    // 2023.July.17 Ver1.0.0 First Release
    // 2023.August.24 Ver1.0.1 Fixed gamepad
    // 2024.January.19 Ver1.1.0 Added common event block
    // 2024.January.21 Ver1.1.1 Added the disable command
    // 2024.January.29 Ver1.1.2 Common events are set via the common events menu

    /*:
    * @target MZ
    * @plugindesc Assigns common events and switches to keyboard, gamepad, and mouse keys
    * @author Phileas
    *
    * @param Common events
    * @type struct<CommonEvents>[]
    * @default []
    *
    * @param Switches
    * @type struct<Switches>[]
    * @default []
    *
    *
    * @command setHotKeysState
    * @text Controller
    * @desc Enables or disables hot keys.
    *
    * @arg enableHotKeys
    * @text Enable
    * @type boolean
    * @desc If this option is on, hotkeys are active.
    * @default true
    *
    * @help
    * The plugin has 2 parameters: Common Events and Switches. They differ only in one field: in Common Events, the number of the common event is set, and in Switch - the switch. The other fields are shared:
    * - Device type - the device that you want to track clicks on.
    * - Key name - string identifier of the button.
    * - Key number - numeric identifier of the button.
    *
    * Starting from version 1.1.0, blocking can be enabled in General Events. If it is enabled, then you can retriggered the event only after it completes execution.
    *
    * The plugin provides one command:
    * - Controller - allows to enable and disable hotkeys.
    *
    * First, the plugin searches for the Key name in the standard dictionaries of the engine. If you haven't redefined them, then they look like this:
    *
    * keyBoard:
    * 9: "tab", // tab
    * 13: "ok", // enter
    * 16: "shift", // shift
    * 17: "control", // control
    * 18: "control", // alt
    * 27: "escape", // escape
    * 32: "ok", // space
    * 33: "pageup", // pageup
    * 34: "pagedown", // pagedown
    * 37: "left", // left arrow
    * 38: "up", // up arrow
    * 39: "right", // right arrow
    * 40: "down", // down arrow
    * 45: "escape", // insert
    * 81: "pageup", // Q
    * 87: "pagedown", // W
    * 88: "escape", // X
    * 90: "ok", // Z
    * 96: "escape", // numpad 0
    * 98: "down", // numpad 2
    * 100: "left", // numpad 4
    * 102: "right", // numpad 6
    * 104: "up", // numpad 8
    * 120: "debug" // F9
    * gamepad:
    * 0: "ok", // A
    * 1: "cancel", // B
    * 2: "shift", // X
    * 3: "menu", // Y
    * 4: "pageup", // LB
    * 5: "pagedown", // RB
    * 12: "up", // D-pad up
    * 13: "down", // D-pad down
    * 14: "left", // D-pad left
    * 15: "right" // D-pad right
    * mouse:
    * 0: "left"
    * 1: "middle"
    * 2: "right"
    *
    * If the plugin has not found the Key name, then it takes the value of Key number.
    *
    * If a keyboard, gamepad, or mouse was pressed during the game, the plugin checks whether a general event or switch is assigned to the key.
    * If a general event is assigned, it is executed. It is not recommended to specify a parallel or automatic event. If a switch is assigned, its value is reversed.
    *
    * You can always write to the author if you need other features or even plugins.
    * Patreon: https://www.patreon.com/treeverse_games
    * Boosty: https://boosty.to/phileas
    * RPG Maker Web: https://forums.rpgmakerweb.com/index.php?members/phileas.176075/
    * RPG Maker Union: https://rpgmakerunion.ru/id/phileas
    * Email: olek.olegovich gmail.com
    * Telegram: olekolegovich
    *
    * [License]
    * This plugin is released under MIT license.
    * http://opensource.org/licenses/mit-license.php
    * This means that you can freely use the plugin in non-commercial and commercial games and even edit it.
    * But be sure to include me in the credits!
    */

    /*~struct~CommonEvents:
    * @param Device type
    * @type combo
    * @option Keyboard
    * @option Gamepad
    * @option Mouse
    * @default Keyboard
    *
    * @param Key number
    * @type number
    * @default 0
    *
    * @param Key name
    * @type name
    * @desc Special key name
    * @default name
    *
    * @param Common event
    * @desc The general event will be executed. It is not recommended to use parallel and automatic events here.
    * @type common_event
    * @default 1
    *
    * @param Block
    * @desc If true, the event can be retriggered only after it completes execution.
    * @type boolean
    * @default true
    */

    /*~struct~Switches:
    * @param Device type
    * @type combo
    * @option Keyboard
    * @option Gamepad
    * @option Mouse
    * @default Keyboard
    *
    * @param Key number
    * @type number
    * @default 0
    *
    * @param Key name
    * @desc Special key name
    * @default name
    *
    * @param Switch
    * @desc The switch will change the value to the opposite.
    * @type switch
    */

    /*:ru
    * @target MZ
    * @plugindesc Назначает общие события и переключатели на клавиши клавиатуры, геймпада и мыши
    * @author Phileas
    *
    * @param Common events
    * @text Общие события
    * @type struct<CommonEvents>[]
    * @default []
    *
    * @param Switches
    * @text Переключатели
    * @type struct<Switches>[]
    * @default []
    *
    * @command setHotKeysState
    * @text Контроллер
    * @desc Включает и отключает горячие клавиши
    *
    * @arg enableHotKeys
    * @text Включить
    * @type boolean
    * @desc Если параметр включён, горячие клавиши активны.
    * @default true
    *
    * @help
    * Плагин имеет 2 параметра: Общие события и Переключатели. Они отличаются только одним полем: в Common Events задается номер общего события, а в Switch - переключатель. Остальные поля являются общими:
    * - Тип устройства - устройство, на котором вы хотите отслеживать клики.
    * - Имя клавиши - строковый идентификатор кнопки.
    * - Номер клавиши - числовой идентификатор кнопки.
    *
    * Начиная с версии 1.1.0, в Общих событиях можно включить блокировку. Если она включена, то повторно стриггерить событие можно будет только после того, как оно завершит выполнение.
    *
    * Плагин предоставляет одну команду:
    * - Контроллер - позволяет включить и отключить горячие клавиши.
    *
    * Сначала плагин выполняет поиск названия ключа в стандартных словарях движка. Если вы не переопределили их, то они выглядят следующим образом:
    *
    * клавиатура:
    * 9: "tab", // tab
    * 13: "ok", // enter
    * 16: "shift", // shift
    * 17: "control", // control
    * 18: "control", // alt
    * 27: "escape", // escape
    * 32: "ok", // space
    * 33: "pageup", // pageup
    * 34: "pagedown", // pagedown
    * 37: "left", // left arrow
    * 38: "up", // up arrow
    * 39: "right", // right arrow
    * 40: "down", // down arrow
    * 45: "escape", // insert
    * 81: "pageup", // Q
    * 87: "pagedown", // W
    * 88: "escape", // X
    * 90: "ok", // Z
    * 96: "escape", // numpad 0
    * 98: "down", // numpad 2
    * 100: "left", // numpad 4
    * 102: "right", // numpad 6
    * 104: "up", // numpad 8
    * 120: "debug" // F9
    * геймпад:
    * 0: "ok", // A
    * 1: "cancel", // B
    * 2: "shift", // X
    * 3: "menu", // Y
    * 4: "pageup", // LB
    * 5: "pagedown", // RB
    * 12: "up", // D-pad up
    * 13: "down", // D-pad down
    * 14: "left", // D-pad left
    * 15: "right" // D-pad right
    * мышь:
    * 0: "left"
    * 1: "middle"
    * 2: "right"
    *
    * Если плагин не нашел имя клавиши, то он принимает значение номера клавиши.
    *
    * Если во время игры была нажата клавиатура, геймпад или мышь, плагин проверяет, назначено ли клавише общее событие или переключатель.
    * Если назначено общее событие, оно выполняется. Не рекомендуется указывать параллельное или автоматическое событие. Если назначен переключатель, его значение меняется на обратное.
    *
    * Вы всегда можете написать автору, если вам нужны другие функции или даже плагины.
    * Boosty: https://boosty.to/phileas
    * Patreon: https://www.patreon.com/treeverse_games
    * RPG Maker Web: https://forums.rpgmakerweb.com/index.php?members/phileas.176075/
    * RPG Maker Union: https://rpgmakerunion.ru/id/phileas
    * Email: olek.olegovich gmail.com
    * Telegram: olekolegovich
    *
    * [License]
    * Этот плагин распространяется по лицензии MIT.
    * http://opensource.org/licenses/mit-license.php
    * Это означает, что вы можете свободно использовать плагин в некоммерческих и коммерческих играх и даже редактировать его.
    * Но обязательно укажите меня в титрах!
    */

    /*~struct~CommonEvents:ru
    * @param Device type
    * @text Тип устройства
    * @type combo
    * @option Keyboard
    * @option Gamepad
    * @option Mouse
    * @default Keyboard
    *
    * @param Key number
    * @text Номер клавиши
    * @type number
    * @default 0
    *
    * @param Key name
    * @text Имя клавиши
    * @type name
    * @desc Специальное имя клавиши
    * @default name
    *
    * @param Common event
    * @text Общее событие
    * @desc Будет выполнено общее событие. Здесь не рекомендуется использовать параллельные и автоматические события.
    * @type common_event
    * @default 1
    *
    * @param Block
    * @text Блокировка
    * @desc Если true, то повторно стриггерить событие можно будет только после того, как оно завершит выполнение.
    * @type boolean
    * @default true
    */

    /*~struct~Switches:ru
    * @param Device type
    * @text Тип устройства
    * @type combo
    * @option Keyboard
    * @option Gamepad
    * @option Mouse
    * @default Keyboard
    *
    * @param Key number
    * @text Номер клавиши
    * @type number
    * @default 0
    *
    * @param Key name
    * @text Имя клавиши
    * @desc Специальное имя клавиши
    * @default name
    *
    * @param Switch
    * @text Переключатель
    * @desc Переключатель изменит значение на противоположное.
    * @type switch
    */

    (function() {

    //--------DATA:
    const phileasMouseKeyMap = {
    "left": 0,
    "middle": 1,
    "right": 2
    }

    var parameters = PluginManager.parameters("Phileas_GameHotKeys");
    var commonEventHotKeys = parsePluginParam(parameters["Common events"]);
    var switchHotKeys = parsePluginParam(parameters["Switches"]);
    var cehkKeyboard = undefined;
    var cehkGamepad = undefined;
    var cehkMouse = undefined;
    var shkKeyboard = undefined;
    var shkGamepad = undefined;
    var shkMouse = undefined;

    var blockedEvents = new Set();
    var disableHotKeys = false;

    PluginManager.registerCommand("Phileas_GameHotKeys ", "setHotKeysState", setHotKeysState);

    //--------MY CODE:
    function parsePluginParam(data) {
    if (data == undefined) {
    return undefined;
    }

    let arr = JSON.parse(data);
    for (let i = 0; i < arr.length; ++i) {
    arr[i] = JSON.parse(arr[i]);
    }

    return arr;
    }

    function getKeyByValue(object, value) {
    return Object.keys(object).find(key => object[key] === value);
    }

    function setHotKeysDictionaries(array, keyboardDict, gamepadDict, mouseDict, value) {
    for (let i = 0; i < array.length; ++i) {
    let code = array[i]["Key number"];
    let name = array[i]["Key name"];
    if (array[i]["Device type"] == "Keyboard") {
    let nameCode = getKeyByValue(Input.keyMapper, name);
    keyboardDict[nameCode == undefined ? code : nameCode] = Number(array[i][value]);
    }
    else if (array[i]["Device type"] == "Gamepad") {
    let nameCode = getKeyByValue(Input.gamepadMapper, name);
    gamepadDict[nameCode == undefined ? code : nameCode] = Number(array[i][value]);
    }
    else if (array[i]["Device type"] == "Mouse") {
    let nameCode = phileasMouseKeyMap[name];
    mouseDict[nameCode == undefined ? code : nameCode] = Number(array[i][value]);
    }
    }
    }

    function setCommonEventHotKeysDictionaries() {
    cehkKeyboard = {};
    cehkGamepad = {};
    cehkMouse = {};
    setHotKeysDictionaries(commonEventHotKeys, cehkKeyboard, cehkGamepad, cehkMouse, "Common event");

    for (let i = 0; i < commonEventHotKeys.length; ++i) {
    if (commonEventHotKeys[i]["Block"] == "true") {
    let id = Number(commonEventHotKeys[i]["Common event"]);
    $dataCommonEvents[id].list.phileasGameHotKeysBlock = true;
    $dataCommonEvents[id].list.phileasEventId = id;
    }
    }
    }

    function setSwitchHotKeysDictionaries() {
    shkKeyboard = {};
    shkGamepad = {};
    shkMouse = {};
    setHotKeysDictionaries(switchHotKeys, shkKeyboard, shkGamepad, shkMouse, "Switch");
    }

    function triggerPhileasCommonEvent(id) {
    if (id == undefined || $dataCommonEvents[id] == undefined) {
    return;
    }

    if ($dataCommonEvents[id].list.phileasGameHotKeysBlock === true) {
    if (blockedEvents.has(id)) {
    return;
    }

    blockedEvents.add(id);
    }

    $gameTemp.reserveCommonEvent(id);
    }

    function triggerPhileasSwitch(id) {
    if (id != undefined) {
    let s = $gameSwitches.value(id);
    $gameSwitches.setValue(id, !s);
    }
    }

    function triggerPhileasKeyboard(code) {
    if (disableHotKeys == true) {
    return;
    }

    triggerPhileasCommonEvent(cehkKeyboard[code]);
    triggerPhileasSwitch(shkKeyboard[code]);
    }

    function triggerPhileasGamepad(code) {
    if (disableHotKeys == true) {
    return;
    }

    triggerPhileasCommonEvent(cehkGamepad[code]);
    triggerPhileasSwitch(shkGamepad[code]);
    }

    function triggerPhileasMouse(code) {
    if (disableHotKeys == true) {
    return;
    }

    triggerPhileasCommonEvent(cehkMouse[code]);
    triggerPhileasSwitch(shkMouse
    Код:
    );
        }
        
        function phileasHotKeysKeyDownHandler(event) {
            triggerPhileasKeyboard(event.keyCode);
        }
        
        function phileasHotKeysMouseDownHandler(event) {
            triggerPhileasMouse(event.button);
        }
        
        function setHotKeysState(params) {
            disableHotKeys = params["enableHotKeys"] != "true";
        }
    
    //--------CHANGED CORE:
        
        const Origin_updateGamepadState = Input._updateGamepadState;
        Input._updateGamepadState = function(gamepad) {
            Origin_updateGamepadState.call(this, gamepad);
            const lastState = this._gamepadStates[gamepad.index] || [];
            let state = this._gamepadStates[gamepad.index];
            for (let i = 0; i < state.length; ++i) {
                if (state[i] == true && lastState[i] != true) {
                    triggerPhileasGamepad(i);
                }
            }
        };
        
        const Origin_clear = Game_Interpreter.prototype.clear;
        Game_Interpreter.prototype.clear = function() {
            if (this._list != undefined && this._list.phileasGameHotKeysBlock === true) {
                blockedEvents.delete(this._list.phileasEventId);
            }
            
            Origin_clear.call(this);
        };
        
        const Origin_terminate = Game_Interpreter.prototype.terminate;
        Game_Interpreter.prototype.terminate = function() {
            if (this._list != undefined && this._list.phileasGameHotKeysBlock === true) {
                blockedEvents.delete(this._list.phileasEventId);
            }
            
            Origin_terminate.call(this);
        };
        
        const Origin_loaded = Scene_Boot.prototype.onDatabaseLoaded;
        Scene_Boot.prototype.onDatabaseLoaded = function() {
            Origin_loaded.call(this);
            
            setCommonEventHotKeysDictionaries();
            setSwitchHotKeysDictionaries();
            
            document.addEventListener("keydown", phileasHotKeysKeyDownHandler);
            document.addEventListener("mousedown", phileasHotKeysMouseDownHandler);
        };
        
        const Origin_setupNewGame = DataManager.setupNewGame;
        DataManager.setupNewGame = function() {
            Origin_setupNewGame.call(this);
            disableHotKeys = false;
        };
        
        const Origin_makeSaveContents = DataManager.makeSaveContents;
        DataManager.makeSaveContents = function() {
            let contents = Origin_makeSaveContents.call(this);
            contents.phileasDisableHotKeys = disableHotKeys;
            
            return contents;
        };
        
        const Origin_extractSaveContents = DataManager.extractSaveContents;
        DataManager.extractSaveContents = function(contents) {
            Origin_extractSaveContents.call(this, contents);
            disableHotKeys = contents.phileasDisableHotKeys || false;
        };
        
    }());

    Или можно скачать файл тут.

    Лицензия
    MIT, вся ответственность на пользователе.

    Совместимость:
    Если будут проблемы - пишите мне.

    Boosty
    Последний раз редактировалось Phileas; 30.01.2024 в 00:55.
    Мои игры

    Мои плагины

    Мой Telegram-канал

    Мой Boosty



    Спойлер In my humble opinion :

    Все мои сообщения отражают лишь моё скромное мнение. Я ни в коем случае не пытаюсь кого-либо обидеть, ни на кого/что не наезжаю и ничего не навязываю. Благодарю за понимание и адекватность.

  2. #2
    Бывалый Аватар для Phileas
    Информация о пользователе
    Регистрация
    05.02.2016
    Адрес
    HD 128620, HR 5459, CP−60°5483, GCTP 3309.00A, LHS 50
    Сообщений
    628
    Записей в дневнике
    26
    Репутация: 23 Добавить или отнять репутацию

    По умолчанию

    Обновление 1.0.1

    Исправлен баг геймпада.
    Мои игры

    Мои плагины

    Мой Telegram-канал

    Мой Boosty



    Спойлер In my humble opinion :

    Все мои сообщения отражают лишь моё скромное мнение. Я ни в коем случае не пытаюсь кого-либо обидеть, ни на кого/что не наезжаю и ничего не навязываю. Благодарю за понимание и адекватность.

  3. #3
    Бывалый Аватар для Phileas
    Информация о пользователе
    Регистрация
    05.02.2016
    Адрес
    HD 128620, HR 5459, CP−60°5483, GCTP 3309.00A, LHS 50
    Сообщений
    628
    Записей в дневнике
    26
    Репутация: 23 Добавить или отнять репутацию

    По умолчанию

    Обновление 1.1.0!

    Теперь опционально можно включить блокировку общего события. Если она включена, то повторно стриггерить событие можно будет только после того, как оно завершит выполнение.

    Также добавил локализацию на русский.
    Последний раз редактировалось Phileas; 20.01.2024 в 03:25.
    Мои игры

    Мои плагины

    Мой Telegram-канал

    Мой Boosty



    Спойлер In my humble opinion :

    Все мои сообщения отражают лишь моё скромное мнение. Я ни в коем случае не пытаюсь кого-либо обидеть, ни на кого/что не наезжаю и ничего не навязываю. Благодарю за понимание и адекватность.

  4. #4
    Бывалый Аватар для Phileas
    Информация о пользователе
    Регистрация
    05.02.2016
    Адрес
    HD 128620, HR 5459, CP−60°5483, GCTP 3309.00A, LHS 50
    Сообщений
    628
    Записей в дневнике
    26
    Репутация: 23 Добавить или отнять репутацию

    По умолчанию

    Обновил до 1.1.2

    Теперь общие события задаются через меню общих событий.
    Также исправил баг локализации.
    Мои игры

    Мои плагины

    Мой Telegram-канал

    Мой Boosty



    Спойлер In my humble opinion :

    Все мои сообщения отражают лишь моё скромное мнение. Я ни в коем случае не пытаюсь кого-либо обидеть, ни на кого/что не наезжаю и ничего не навязываю. Благодарю за понимание и адекватность.

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Метки этой темы

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •  
[MZ] Phileas_GameHotKeys